/**
 * 讨论区API测试脚本
 * 使用方法：node test-discussion-api.js
 */

const axios = require('axios');

const API_BASE_URL = 'http://localhost:8080';
let TOKEN = ''; // 这里填入你的JWT Token

// 创建axios实例
const request = axios.create({
  baseURL: API_BASE_URL,
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json'
  }
});

// 请求拦截器
request.interceptors.request.use(config => {
  if (TOKEN) {
    config.headers.Authorization = `Bearer ${TOKEN}`;
  }
  console.log(`\n>>> ${config.method.toUpperCase()} ${config.url}`);
  if (config.data) {
    console.log('请求数据:', JSON.stringify(config.data, null, 2));
  }
  if (config.params) {
    console.log('请求参数:', config.params);
  }
  return config;
});

// 响应拦截器
request.interceptors.response.use(
  response => {
    console.log(`<<< 状态码: ${response.status}`);
    console.log('响应数据:', JSON.stringify(response.data, null, 2));
    return response.data;
  },
  error => {
    console.error(`<<< 错误: ${error.response?.status || error.message}`);
    if (error.response?.data) {
      console.error('错误信息:', JSON.stringify(error.response.data, null, 2));
    }
    return Promise.reject(error);
  }
);

// ============================================
// 测试用例
// ============================================

async function runTests() {
  console.log('========================================');
  console.log('讨论区API测试开始');
  console.log('========================================');
  
  try {
    // ====== 测试1: 获取热门标签 ======
    console.log('\n【测试1】获取热门标签');
    const tagsRes = await request.get('/api/discussions/tags/hot');
    console.log(`✅ 成功获取 ${tagsRes.data?.length || 0} 个标签`);
    
    // ====== 测试2: 获取讨论列表（热门） ======
    console.log('\n【测试2】获取讨论列表（热门排序）');
    const listRes = await request.get('/api/discussions', {
      params: {
        page: 1,
        pageSize: 10,
        sort: 'hot'
      }
    });
    console.log(`✅ 成功获取 ${listRes.data?.list?.length || 0} 条讨论`);
    console.log(`总记录数: ${listRes.data?.total || 0}`);
    
    // ====== 测试3: 发布讨论 ======
    console.log('\n【测试3】发布讨论');
    const createRes = await request.post('/api/discussions', {
      title: '这是一个测试讨论标题',
      content: '<p>这是测试内容，用于验证API接口是否正常工作。</p>',
      tags: ['测试', '接口验证']
    });
    const discussionId = createRes.data?.id;
    console.log(`✅ 成功发布讨论，ID: ${discussionId}`);
    
    if (discussionId) {
      // ====== 测试4: 获取讨论详情 ======
      console.log('\n【测试4】获取讨论详情');
      const detailRes = await request.get(`/api/discussions/${discussionId}`);
      console.log(`✅ 成功获取讨论详情: ${detailRes.data?.title}`);
      
      // ====== 测试5: 点赞讨论 ======
      console.log('\n【测试5】点赞讨论');
      const likeRes = await request.post(`/api/discussions/${discussionId}/like`);
      console.log(`✅ 点赞成功，当前状态: ${likeRes.data?.isLiked ? '已点赞' : '未点赞'}`);
      console.log(`点赞数: ${likeRes.data?.likes}`);
      
      // ====== 测试6: 取消点赞 ======
      console.log('\n【测试6】取消点赞');
      const unlikeRes = await request.post(`/api/discussions/${discussionId}/like`);
      console.log(`✅ 取消点赞成功，当前状态: ${unlikeRes.data?.isLiked ? '已点赞' : '未点赞'}`);
      console.log(`点赞数: ${unlikeRes.data?.likes}`);
      
      // ====== 测试7: 收藏讨论 ======
      console.log('\n【测试7】收藏讨论');
      const favoriteRes = await request.post(`/api/discussions/${discussionId}/favorite`);
      console.log(`✅ 收藏成功，当前状态: ${favoriteRes.data?.isFavorited ? '已收藏' : '未收藏'}`);
      console.log(`收藏数: ${favoriteRes.data?.favorites}`);
      
      // ====== 测试8: 发布评论 ======
      console.log('\n【测试8】发布评论');
      const commentRes = await request.post(`/api/discussions/${discussionId}/comments`, {
        content: '这是一条测试评论',
        parentId: null
      });
      const commentId = commentRes.data?.id;
      console.log(`✅ 成功发布评论，ID: ${commentId}`);
      
      // ====== 测试9: 获取评论列表 ======
      console.log('\n【测试9】获取评论列表');
      const commentsRes = await request.get(`/api/discussions/${discussionId}/comments`, {
        params: {
          page: 1,
          pageSize: 50,
          sort: 'hot'
        }
      });
      console.log(`✅ 成功获取 ${commentsRes.data?.list?.length || 0} 条评论`);
      
      if (commentId) {
        // ====== 测试10: 发布回复 ======
        console.log('\n【测试10】发布回复');
        const replyRes = await request.post(`/api/discussions/${discussionId}/comments`, {
          content: '这是一条测试回复',
          parentId: commentId
        });
        console.log(`✅ 成功发布回复，ID: ${replyRes.data?.id}`);
        
        // ====== 测试11: 获取评论回复列表 ======
        console.log('\n【测试11】获取评论回复列表');
        const repliesRes = await request.get(`/api/comments/${commentId}/replies`, {
          params: {
            page: 1,
            pageSize: 50
          }
        });
        console.log(`✅ 成功获取 ${repliesRes.data?.list?.length || 0} 条回复`);
        
        // ====== 测试12: 点赞评论 ======
        console.log('\n【测试12】点赞评论');
        const likeCommentRes = await request.post(`/api/comments/${commentId}/like`);
        console.log(`✅ 点赞评论成功，点赞数: ${likeCommentRes.data?.likes}`);
      }
      
      // ====== 测试13: 搜索讨论 ======
      console.log('\n【测试13】搜索讨论（关键词：测试）');
      const searchRes = await request.get('/api/discussions', {
        params: {
          page: 1,
          pageSize: 10,
          keyword: '测试'
        }
      });
      console.log(`✅ 搜索结果: ${searchRes.data?.list?.length || 0} 条讨论`);
      
      // ====== 测试14: 按标签筛选 ======
      console.log('\n【测试14】按标签筛选（标签：测试）');
      const filterRes = await request.get('/api/discussions', {
        params: {
          page: 1,
          pageSize: 10,
          tag: '测试'
        }
      });
      console.log(`✅ 筛选结果: ${filterRes.data?.list?.length || 0} 条讨论`);
      
      // ====== 清理：删除测试数据 ======
      console.log('\n【清理】删除测试讨论');
      await request.delete(`/api/discussions/${discussionId}`);
      console.log('✅ 测试数据清理完成');
    }
    
    console.log('\n========================================');
    console.log('✅ 所有测试通过！');
    console.log('========================================');
    
  } catch (error) {
    console.error('\n========================================');
    console.error('❌ 测试失败！');
    console.error('========================================');
    console.error('错误详情:', error.message);
    if (error.response) {
      console.error('响应状态:', error.response.status);
      console.error('响应数据:', error.response.data);
    }
    process.exit(1);
  }
}

// ============================================
// 运行测试
// ============================================

// 检查Token
if (!TOKEN) {
  console.warn('警告: 未设置TOKEN，部分测试可能失败');
  console.warn('请在脚本中设置 TOKEN 变量');
  console.warn('');
}

runTests();

